home *** CD-ROM | disk | FTP | other *** search
- /*
- * Glue routines to call the MacTCP drivers
- *
- * Summer 1989, Tom Milligan, University of Toronto Computing Services
- */
-
-
- #include <memory.h>
- #include <devices.h>
- #include <files.h>
- #include <errors.h>
-
- #include "tcpglue.h"
-
- static short driver = 0;
-
- /*
- * create a TCP stream
- */
- OSErr xTCPCreate(buflen,notify,pb)
- int buflen;
- TCPNotifyProc notify;
- TCPiopb *pb;
- {
- OSErr io;
-
- xOpenDriver(driver,io);
-
- pb->ioCRefNum = driver;
- pb->csCode = TCPCreate;
- pb->csParam.create.rcvBuff = NewPtr(buflen);
- pb->csParam.create.rcvBuffLen = buflen;
- pb->csParam.create.notifyProc = notify;
- xPBControlSync(pb,io);
- return(io);
- }
-
- /*
- * start listening for a TCP connection
- */
- OSErr xTCPPassiveOpen(pb,port,completion)
- TCPiopb *pb;
- short port;
- TCPIOCompletionProc completion;
- {
- if (driver == 0)
- return(invalidStreamPtr);
-
- pb->ioCRefNum = driver;
- pb->csCode = TCPPassiveOpen;
- pb->csParam.open.validityFlags = timeoutValue | timeoutAction;
- pb->csParam.open.ulpTimeoutValue = 60 /* seconds */;
- pb->csParam.open.ulpTimeoutAction = 1 /* 1:abort 0:report */;
- pb->csParam.open.commandTimeoutValue = 0 /* infinity */;
- pb->csParam.open.remoteHost = 0;
- pb->csParam.open.remotePort = 0;
- pb->csParam.open.localHost = 0;
- pb->csParam.open.localPort = port;
- pb->csParam.open.dontFrag = 0;
- pb->csParam.open.timeToLive = 0;
- pb->csParam.open.security = 0;
- pb->csParam.open.optionCnt = 0;
- xPBControl(pb,completion);
- }
-
- /*
- * connect to a remote TCP
- */
- OSErr xTCPActiveOpen(pb,port,rhost,rport,completion)
- TCPiopb *pb;
- short port;
- long rhost;
- short rport;
- TCPIOCompletionProc completion;
- {
- if (driver == 0)
- return(invalidStreamPtr);
-
- pb->ioCRefNum = driver;
- pb->csCode = TCPActiveOpen;
- pb->csParam.open.validityFlags = timeoutValue | timeoutAction;
- pb->csParam.open.ulpTimeoutValue = 60 /* seconds */;
- pb->csParam.open.ulpTimeoutAction = 1 /* 1:abort 0:report */;
- pb->csParam.open.commandTimeoutValue = 0;
- pb->csParam.open.remoteHost = rhost;
- pb->csParam.open.remotePort = rport;
- pb->csParam.open.localHost = 0;
- pb->csParam.open.localPort = port;
- pb->csParam.open.dontFrag = 0;
- pb->csParam.open.timeToLive = 0;
- pb->csParam.open.security = 0;
- pb->csParam.open.optionCnt = 0;
- xPBControl(pb,completion);
- }
-
- /*
- * ask for incoming data
- */
- OSErr xTCPRcv(pb,buf,buflen,completion)
- TCPiopb *pb;
- Ptr buf;
- int buflen;
- TCPIOCompletionProc completion;
- {
- if (driver == 0)
- return(invalidStreamPtr);
-
- pb->ioCRefNum = driver;
- pb->csCode = TCPRcv;
- pb->csParam.receive.commandTimeoutValue = 0 /* infinity */;
- pb->csParam.receive.rcvBuff = buf;
- pb->csParam.receive.rcvBuffLen = buflen;
- xPBControl(pb,completion);
- }
-
- /*
- * send data
- */
- OSErr xTCPSend(pb,wds,push,urgent,completion)
- TCPiopb *pb;
- wdsEntry *wds;
- Boolean push;
- Boolean urgent;
- TCPIOCompletionProc completion;
- {
- if (driver == 0)
- return(invalidStreamPtr);
-
- pb->ioCRefNum = driver;
- pb->csCode = TCPSend;
- pb->csParam.send.validityFlags = timeoutValue | timeoutAction;
- pb->csParam.send.ulpTimeoutValue = 60 /* seconds */;
- pb->csParam.send.ulpTimeoutAction = 1 /* 1:abort 0:report */;
- pb->csParam.send.pushFlag = push;
- pb->csParam.send.urgentFlag = urgent;
- pb->csParam.send.wdsPtr = (Ptr)wds;
- xPBControl(pb,completion);
- }
-
- /*
- * close a connection
- */
- OSErr xTCPClose(pb,completion)
- TCPiopb *pb;
- TCPIOCompletionProc completion;
- {
- if (driver == 0)
- return(invalidStreamPtr);
-
- pb->ioCRefNum = driver;
- pb->csCode = TCPClose;
- pb->csParam.close.validityFlags = timeoutValue | timeoutAction;
- pb->csParam.close.ulpTimeoutValue = 60 /* seconds */;
- pb->csParam.close.ulpTimeoutAction = 1 /* 1:abort 0:report */;
- xPBControl(pb,completion);
- }
-
- /*
- * abort a connection
- */
- OSErr xTCPAbort(pb)
- TCPiopb *pb;
- {
- OSErr io;
-
- if (driver == 0)
- return(invalidStreamPtr);
-
- pb->ioCRefNum = driver;
- pb->csCode = TCPAbort;
- xPBControlSync(pb,io);
- return(io);
- }
-
- /*
- * close down a TCP stream (aborting a connection, if necessary)
- */
- OSErr xTCPRelease(pb)
- TCPiopb *pb;
- {
- OSErr io;
-
- if (driver == 0)
- return(invalidStreamPtr);
-
- pb->ioCRefNum = driver;
- pb->csCode = TCPRelease;
- xPBControlSync(pb,io);
- if (io == noErr)
- DisposPtr(pb->csParam.create.rcvBuff); /* there is no release pb */
- return(io);
- }
-
- int
- xTCPBytesUnread(pb)
- TCPiopb *pb;
- {
- OSErr io;
-
- if (driver == 0)
- return(-1);
-
- pb->ioCRefNum = driver;
- pb->csCode = TCPStatus;
- xPBControlSync(pb,io);
- if (io != noErr)
- return(-1);
- return(pb->csParam.status.amtUnreadData);
- }
-
-
- int
- xTCPState(pb)
- TCPiopb *pb;
- {
- OSErr io;
-
- if (driver == 0)
- return(-1);
-
- pb->ioCRefNum = driver;
- pb->csCode = TCPStatus;
- xPBControlSync(pb,io);
- if (io != noErr)
- return(-1);
- return(pb->csParam.status.connectionState);
- }
-
-
- /*
- * create a UDP stream
- */
- OSErr xUDPCreate(buflen,notify,port,pb)
- int buflen;
- UDPNotifyProc notify;
- ip_port port;
- UDPiopb *pb;
- {
- OSErr io;
-
- xOpenDriver(driver,io);
-
- pb->ioCRefNum = driver;
- pb->csCode = UDPCreate;
- pb->csParam.create.rcvBuff = NewPtr(buflen);
- pb->csParam.create.rcvBuffLen = buflen;
- pb->csParam.create.notifyProc = notify;
- pb->csParam.create.localPort = port;
- xPBControlSync(pb,io);
- return(io);
- }
-
- /*
- * ask for incoming data
- */
- OSErr xUDPRead(pb,completion)
- UDPiopb *pb;
- UDPIOCompletionProc completion;
- {
- if (driver == 0)
- return(invalidStreamPtr);
-
- pb->ioCRefNum = driver;
- pb->csCode = UDPRead;
- pb->csParam.receive.timeOut = 0 /* infinity */;
- pb->csParam.receive.secondTimeStamp = 0/* must be zero */;
- xPBControl(pb,completion);
- }
-
- OSErr xUDPBfrReturn(pb)
- UDPiopb *pb;
- {
- OSErr io;
-
- if (driver == 0)
- return(invalidStreamPtr);
-
- pb->ioCRefNum = driver;
- pb->csCode = UDPBfrReturn;
- /* rcvBuff is still there from the read */
- xPBControlSync(pb,io);
- return(io);
- }
-
- /*
- * send data
- */
- OSErr xUDPWrite(pb,host,port,wds,completion)
- UDPiopb *pb;
- ip_addr host;
- ip_port port;
- Ptr wds;
- UDPIOCompletionProc completion;
- {
- if (driver == 0)
- return(invalidStreamPtr);
-
- pb->ioCRefNum = driver;
- pb->csCode = UDPWrite;
- pb->csParam.send.remoteHost = host;
- pb->csParam.send.remotePort = port;
- pb->csParam.send.wdsPtr = wds;
- pb->csParam.send.checkSum = true;
- pb->csParam.send.sendLength = 0/* must be zero */;
- xPBControl(pb,completion);
- }
-
- /*
- * close down a UDP stream (aborting a read, if necessary)
- */
- OSErr xUDPRelease(pb)
- UDPiopb *pb;
- {
- OSErr io;
-
- if (driver == 0)
- return(invalidStreamPtr);
-
- pb->ioCRefNum = driver;
- pb->csCode = UDPRelease;
- xPBControlSync(pb,io);
- if (io == noErr)
- {
- /* there is no release pb, so I'm using create because */
- /* the buffer pointer is in the right place */
- DisposPtr(pb->csParam.create.rcvBuff);
- }
- return(io);
- }
-
- ip_addr xIPAddr()
- {
- struct IPParamBlock pbrec, *pb = &pbrec;
- OSErr io;
-
- xOpenDriver(driver,0);
-
- pb->ioCRefNum = driver;
- pb->csCode = ipctlGetAddr;
- xPBControlSync(pb,io);
- if (io != noErr)
- return(0);
- return(pb->ourAddress);
- }
-
- long xNetMask()
- {
- struct IPParamBlock pbrec, *pb = &pbrec;
- OSErr io;
-
- xOpenDriver(driver,0);
-
- pb->ioCRefNum = driver;
- pb->csCode = ipctlGetAddr;
- xPBControlSync(pb,io);
- if (io != noErr)
- return(0);
- return(pb->ourNetMask);
- }
-
- unsigned short xMaxMTU()
- {
- struct UDPiopb pbrec, *pb = &pbrec;
- OSErr io;
-
- xOpenDriver(driver,0);
-
- pb->ioCRefNum = driver;
- pb->csCode = UDPMaxMTUSize;
- pb->csParam.mtu.remoteHost = xIPAddr();
- xPBControlSync(pb,io);
- if (io != noErr)
- return(0);
- return(pb->csParam.mtu.mtuSize);
- }
-
-
-